""" Newton Fraktal Halley Methode www.3d-meier.de 18.01.1015 """ import c4d import math import cmath from c4d import gui from c4d import documents # Variablen und Konstanten Titel = 'Halley' # Titel der Methode xMin = -2.5 # Wertebereich x xMax = 2.5 yMin = -2.5 # Wertebereich y yMax = 2.5 Nx = 250 # Anzahl Punkte x Ny = 250 # Anzahl Punkte y Nmax = 100 # Iterationstiefe Faktor = 1000 # Skalierungsfaktor n = 0 # Nummer der Nullstelle Delta = 0.001 # Differenz zum Abbruch der Berechnung # Nullstellen der Funktion Null = [complex(-0.5, 0.866025403784), complex(-0.5, -0.866025403784), complex(1.0, 0.0)] # Eingabedialog class MyDialogs(gui.GeDialog): res = False # Erzeugung des Layouts def CreateLayout(self): self.SetTitle(Titel) # Eingabe der Konstanten self.GroupBegin(2000, c4d.BFH_CENTER, 2, 0, "Bereich der komplexen Ebene") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(90, 2) self.AddStaticText(2001, c4d.BFH_LEFT, 0, 0, 'x-Min', c4d.BORDER_NONE) self.AddEditNumber(1001, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2002, c4d.BFH_LEFT, 0, 0, 'x-Max', c4d.BORDER_NONE) self.AddEditNumber(1002, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2003, c4d.BFH_LEFT, 0, 0, 'y-Min', c4d.BORDER_NONE) self.AddEditNumber(1003, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2004, c4d.BFH_LEFT, 0, 0, 'y-Max', c4d.BORDER_NONE) self.AddEditNumber(1004, c4d.BFH_CENTER, 100, 0) self.GroupEnd() self.AddSeparatorV(300, c4d.BFH_CENTER) # Eingabe der Startwerte self.GroupBegin(2005, c4d.BFH_CENTER, 2, 0, "Berechnung") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(27, 2) self.AddStaticText(2006, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte x', c4d.BORDER_NONE) self.AddEditNumberArrows(1005, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2007, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte y', c4d.BORDER_NONE) self.AddEditNumberArrows(1006, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2008, c4d.BFH_LEFT, 0, 0, 'Iterationstiefe', c4d.BORDER_NONE) self.AddEditNumberArrows(1007, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2010, c4d.BFH_LEFT, 0, 0, 'Skalierungsfaktor', c4d.BORDER_NONE) self.AddEditNumber(1009, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2011, c4d.BFH_LEFT, 0, 0, 'Nummer der Nullstelle', c4d.BORDER_NONE) self.AddEditNumber(1010, c4d.BFH_CENTER, 100, 0) self.GroupEnd() self.AddSeparatorV(300, c4d.BFH_CENTER) # Dialog mit OK schließen self.AddDlgGroup(c4d.DLG_OK|c4d.DLG_CANCEL) return False # Variablen im Eingabemenü setzen def InitValues(self): self.SetFloat(1001, xMin) self.SetFloat(1002, xMax) self.SetFloat(1003, yMin) self.SetFloat(1004, yMax) self.SetLong(1005, Nx, 1, 1000000000) self.SetLong(1006, Ny, 1, 1000000000) self.SetLong(1007, Nmax, 1, 1000000000) self.SetFloat(1009, Faktor) self.SetLong(1010, n) return True # Werte übernehmen wenn Dialog geschlossen def AskClose(self): global xMin, xMax, yMin, yMax, Nx, Ny, Nmax, Faktor, n xMin = self.GetFloat(1001) xMax = self.GetFloat(1002) yMin = self.GetFloat(1003) yMax = self.GetFloat(1004) Nx = self.GetLong(1005) Ny = self.GetLong(1006) Nmax = self.GetLong(1007) Faktor = self.GetFloat(1009) n = self.GetLong(1010) return False # ????? def Command(self, id, msg): if id == 1:self.res = True if id == 1 or id == 2: self.Close() return True def CreatePolygonObject(): # Polygonobjekt erzeugen obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject((Nx+1)*(Ny+1), Nx*Ny) obj.SetName(Titel + "-" + str(n)) # Zähler zz=0 # Segmentbreiten berechnen dx=(xMax-xMin)/(Nx-1) dy=(yMax-yMin)/(Ny-1) # Punkte erzeugen for j in xrange(0,Ny+1): for i in xrange(0,Nx+1): # Berechnung der Punkte y=yMax-j*dy x=xMin+i*dx # Punkt speichern obj.SetPoint(zz, c4d.Vector((x-dx/2)*Faktor,(y+dy/2)*Faktor,0)) # Zähler erhöhen zz=zz+1 # Polygone erzeugen zz=0 # Zähler zurücksetzen for j in xrange(0,Ny): for i in xrange(0,Nx): # Komplexe Zahl bilden y=yMax-j*dy x=xMin+i*dx # Iteration z = complex(x, y) for k in xrange(0,Nmax): if abs(z - Null[n]) < Delta: break f = z**3 - 1 f1 = 3 * z**2 f2 = 6 * z # Division durch Null verhindern if abs(f1) < 0.000001: f1 = 0.0001 z = z - (2*f*f1)/(2*f1**2 - f*f2) if abs(z - Null[n]) < Delta: # Punkte für ein Quadrat definieren P1=j*(Nx+1)+i P2=j*(Nx+1)+i+1 P3=(j+1)*(Nx+1)+i+1 P4=(j+1)*(Nx+1)+i # Quadrat speichern obj.SetPolygon(zz, c4d.CPolygon(P1,P2,P3,P4)) # Zähler erhöhen zz=zz+1 # obj.Message(c4d.MSG_UPDATE) return obj def main(): dlg = MyDialogs() dlg.Open(c4d.DLG_TYPE_MODAL) if dlg.res: plyobj = CreatePolygonObject() doc.InsertObject(plyobj, None, None, True) doc.SetActiveObject(plyobj) c4d.CallCommand(14039) # Mesh optimieren c4d.EventAdd() if __name__=='__main__': main()